package com.cskaoyan.javase.exception._0introduction;

/**
 * @description: 异常体系的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 什么异常?
 *      程序在运行时期出现了不正常的情况，在控制台打印报错信息，并导致程序终止
 * 异常要和程序编译报错进行区分,一个是编译时期,一个是程序运行时期
 * 产生异常的代码,仍然是符合代码逻辑,符合语法的代码,能够通过编译
 *
 * Java的异常体系:
 * Throwable（祖先类）
 * - Error 严重错误,一般指虚拟机内部错误或者资源耗尽错误,了解即可 所有Error子类的命名都叫XXXError
 * - Exception 一般问题,往往都是可以被解决的问题,所有Exception的子类命名都叫XXXException
 *   - RuntimeException 运行时异常
 *     指的是在程序运行期间，发生的一般问题，称之为运行时异常,在编译时期不会有任何表现
 *     比如数组下标越界异常(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)
 *          算术异常(ArithmeticException) 类型转换异常(ClassCastException)....
 *
 *     需要明确的是：
 *          运行时异常绝大多数都是因为编码问题所导致的
 *          如果程序不是就为了制造运行时异常而生,那么最好能够重构代码，修正问题
 *
 *   - 非RuntimeException 非运行时异常,也叫编译时异常
 *      编译时异常指的是:
 *          那些必须在程序编译时期就显式处理的异常,如果不处理程序就会编译报错,程序无法执行
 *          比如做克隆操作中的CloneNotSupportedException就是常见的编译时异常
 *          再I/O操作当中的IOException
 *
 *
 *  运行时异常和编译时异常的划分:
 *      1.Exception子类中的RuntimeException自身以及它的所有子类,都是运行时异常
 *      2.Exception子类中除开RuntimeException自身以及它的所有子类,都是编译时异常
 *
 * 注意事项:
 *      1.Exception是编译时异常还是运行时异常,还是纯粹做一个父类?
 *          Exception在java当中默认作为编译时异常处理,它不仅仅是所有异常的父类,还可以看成是所有编译时异常的父类
 *      2.Error仅作了解,不需要深入学习
 *      3.编译时异常因为在程序的编译时期必须检查它,处理它,所以也叫做受(语法)检查的异常(Checked Exception)
 *          相应的运行时异常无需编译时期检查,称之为不受检查的异常(Unchecked Exception)
 *      4.编译时异常有在编译时期警告和强制程序员处理问题的功能,它可以很大程度上避免程序出现问题
 *          但是很多问题,受限于编译器本身,是检查不出来的,必须等到程序运行起来才能够被发现,这就是运行时异常
 *
 *          设计异常体系的原则:
 *          尽量把一切错误，摒弃在程序运行之前，最好在编译时期就发现程序潜在的问题（通过编译器）
 *              确实，Java把相当一部分异常定义为编译时异常，让程序员在编译时期就显式的处理它们
 *              但仍然有很多问题，必须要Java程序运行起来，才可能产生，被发现，是编译器检查不到的
 * -            这就是运行时异常
 *
 */
public class Demo {
    public static void main(String[] args) {
        //程序一旦产生异常,异常之前的代码正常执行,之后的代码不执行
        int[] arr = new int[3];
        //System.out.println(arr[4]);
        arr = null;
        //System.out.println(arr.length);


        //最容易制造的运行时异常,算术异常(ArithmeticException)
        //System.out.println(10 / 0);

        A a = new A();
        //Unhandled exception: java.lang.CloneNotSupportedException
        //a.clone();
    }
}
class A implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
